home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / viewers / prev / prev.lha / sphere.c < prev    next >
C/C++ Source or Header  |  1991-03-11  |  2KB  |  93 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include "art.h"
  4. #include "macro.h"
  5. #include "gram.h"
  6.  
  7. extern mats    *mstackp;
  8. extern hlist    *fhlist;
  9. extern float    tolerance;
  10. extern int    lookatdone, longlines, latlines;
  11.  
  12. /*
  13.  * sphereinit
  14.  *
  15.  *    initialise the function pointers and fields for a sphere object,
  16.  * returning its pointer.
  17.  */
  18. void
  19. sphereinit(o, d)
  20.     object    *o;
  21.     details *d;
  22. {
  23.     details    *ld;
  24.     vector    cent, radii;
  25.     float    i, delta;
  26.     float    a, r, z;
  27.  
  28.     cent.x = cent.y = cent.z = 0.0;        /* default sphere */
  29.     radii.x = radii.y = radii.z = 1.0;
  30.  
  31.     if (!lookatdone)
  32.         deflookat();
  33.  
  34.     while (d != (details *)NULL) {
  35.         switch (d->type) {
  36.         case CENTER:
  37.             cent = d->u.v;
  38.             break;
  39.         case RADII:
  40.             radii = d->u.v;
  41.             break;
  42.         case RADIUS:
  43.             radii.x = radii.y = radii.z = d->u.f;
  44.             break;
  45.         default:
  46.             warning("art: illegal field in sphere ignored.\n");
  47.         }
  48.         ld = d;
  49.         d = d->nxt;
  50.         free(ld);
  51.     }
  52.  
  53.     pushmatrix();
  54.  
  55.         calctransforms(mstackp);
  56.         multmatrix(mstackp->obj2ray);
  57.  
  58.         translate(cent.x, cent.y, cent.z);
  59.  
  60.         scale(radii.x, radii.y, radii.z);
  61.  
  62.         /*
  63.          * create the longitudinal rings
  64.          */
  65.                              
  66.         delta = 180.0 / longlines;
  67.         for (i = 0; i < 170; i += delta) {
  68.             pushmatrix();
  69.                 rotate(i, 'y');
  70.                 circle(0.0, 0.0, 1.0);
  71.             popmatrix();
  72.         }
  73.  
  74.         /*
  75.          * create the latitudinal rings
  76.          */
  77.                              
  78.         pushmatrix();
  79.             rotate(90.0, 'x');
  80.             delta = 180.0 / latlines;
  81.             for (a = -90.0; a < 80.0; a += delta) {
  82.                 r = cos((double)a * M_PI / 180.0);
  83.                 z = sin((double)a * M_PI / 180.0);
  84.                 pushmatrix();
  85.                     translate(0.0, 0.0, -z);
  86.                     circle(0.0, 0.0, r);
  87.                 popmatrix();
  88.             }
  89.         popmatrix();
  90.  
  91.     popmatrix();
  92. }
  93.